{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 93,
      "metadata": {
        "id": "kF9XEHz3H2kp"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from matplotlib.backends.backend_pdf import PdfPages"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Load Dataset"
      ],
      "metadata": {
        "id": "APxF9M-rMlnQ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "train_data = np.load('s2_train.npy',allow_pickle=True)\n",
        "test_data = np.load('s2_test.npy',allow_pickle=True)"
      ],
      "metadata": {
        "id": "vxM8dMAyIVti"
      },
      "execution_count": 94,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Sample of the PPG signal"
      ],
      "metadata": {
        "id": "RGoVzVUIUbsC"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.figure(figsize=(12,2))  # Optional: Set the figure size\n",
        "plt.plot((train_data[0,0])[0:1000] , label='1D Array')  # Plot the 1D array\n",
        "plt.title('1D Array Plot')  # Set the title\n",
        "plt.xlabel('Index')  # Set the X-axis label (index in this case)\n",
        "plt.ylabel('Value')  # Set the Y-axis label (values from the array)\n",
        "plt.legend()  # Show legend\n",
        "\n",
        "# Show the plot\n",
        "plt.grid()  # Optional: Add gridlines\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 256
        },
        "id": "IVWI3IrRUBEh",
        "outputId": "72c25ba0-e2f2-4926-99fa-477d79603344"
      },
      "execution_count": 95,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1200x200 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Separate PPG Signal(length=10s)"
      ],
      "metadata": {
        "id": "H5oA6YWXUnUq"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "n=125*10\n",
        "i=0\n",
        "data=np.ones((np.size(train_data[1][0])//n,n))\n",
        "for i in range(np.size(train_data[1][0])//n):\n",
        "    if i==np.size(train_data[1][0])//n:\n",
        "        data[i][:] =(train_data[1][0])[n*i:]\n",
        "    else:\n",
        "        data[i][:]=(train_data[1][0])[n*i:n*(i+1)]"
      ],
      "metadata": {
        "id": "kJJTjqWQUrLJ"
      },
      "execution_count": 96,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## PDF Report- Plot All Signals in the PDF File"
      ],
      "metadata": {
        "id": "pmJwLAX4VzPr"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "with PdfPages(r'ppg.pdf') as export_pdf:\n",
        "    s=0\n",
        "    for t in range(np.size(train_data[1][0])//n//6):\n",
        "        plt.figure(figsize=(20,18))\n",
        "        for i in range(6):\n",
        "            plt.subplot(6,1,i+1)\n",
        "            plt.plot(data[s], color='red')\n",
        "            plt.title(s)\n",
        "            s+=1\n",
        "        plt.suptitle(\"PPG signal\")\n",
        "        plt.tight_layout()\n",
        "        export_pdf.savefig()\n",
        "        plt.close()"
      ],
      "metadata": {
        "id": "J3ZFH9iLV8JC"
      },
      "execution_count": 97,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Find Signals Peak\n",
        "\n",
        "### Separate PPG Signal(peak number=10)\n"
      ],
      "metadata": {
        "id": "G2E1DtXpWNa6"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install pyampd"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fh6LB2x5YCOp",
        "outputId": "b4b06bbf-612b-425f-ac95-20f33de48cac"
      },
      "execution_count": 30,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting pyampd\n",
            "  Downloading pyampd-0.0.1-py2.py3-none-any.whl (5.1 kB)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from pyampd) (1.23.5)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from pyampd) (1.11.3)\n",
            "Installing collected packages: pyampd\n",
            "Successfully installed pyampd-0.0.1\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from pyampd.ampd import find_peaks\n",
        "\n",
        "data_ampd = []\n",
        "c = 0\n",
        "\n",
        "for n in range(50):\n",
        "    ppg = []\n",
        "    ppg = train_data[n][0]\n",
        "    peaks = find_peaks(ppg, scale=100)\n",
        "    for i in range(np.size(peaks)//10):\n",
        "        if i == np.size(peaks)//10:\n",
        "            data_ampd.append((train_data[n][0])[peaks[i*10]-30:peaks[(i+1)*10-1]])\n",
        "        else:\n",
        "            data_ampd.append((train_data[n][0])[peaks[i*10]-30:peaks[(i+1)*10-1]+30])\n",
        "        c+=1\n",
        "\n",
        "pb_ampd=[]\n",
        "c=0\n",
        "\n",
        "for n in range(50):\n",
        "    pb = []\n",
        "    pb = train_data[n][1]\n",
        "    peaks = find_peaks(pb, scale=100)\n",
        "    for i in range(np.size(peaks)//10):\n",
        "        if i == np.size(peaks)//10:\n",
        "            pb_ampd.append((data[n][1])[peaks[i*10]-30:peaks[(i+1)*10-1]])\n",
        "        else:\n",
        "            pb_ampd.append((train_data[n][1])[peaks[i*10]-30:peaks[(i+1)*10-1]+30])\n",
        "        c += 1"
      ],
      "metadata": {
        "id": "xHcxaY2NWUmC"
      },
      "execution_count": 98,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#find peaks & separate test signal\n",
        "test_ampd=[]\n",
        "c=0\n",
        "\n",
        "for n in range(5):\n",
        "    ppg=[]\n",
        "    ppg=test_data[n][0]\n",
        "    peaks = find_peaks(ppg, scale=100)\n",
        "    for i in range(np.size(peaks)//10):\n",
        "        if i==np.size(peaks)//10:\n",
        "            test_ampd.append((test_data[n][0])[peaks[i*10]-30:peaks[(i+1)*10-1]])\n",
        "        else:\n",
        "            test_ampd.append((test_data[n][0])[peaks[i*10]-30:peaks[(i+1)*10-1]+30])\n",
        "        c+=1"
      ],
      "metadata": {
        "id": "pSokxZCaw7aD"
      },
      "execution_count": 116,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "##Separate BP Signal(peak number=10)\n",
        "###Finding Valleys and Peaks"
      ],
      "metadata": {
        "id": "sAuq5tKVYMSh"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install peakdetect"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "U6RvdS8rYy_H",
        "outputId": "5a5d72ef-2568-4c46-c1ec-64ed50a99a27"
      },
      "execution_count": 35,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting peakdetect\n",
            "  Downloading peakdetect-1.2-py2.py3-none-any.whl (9.7 kB)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from peakdetect) (1.23.5)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from peakdetect) (1.11.3)\n",
            "Installing collected packages: peakdetect\n",
            "Successfully installed peakdetect-1.2\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from peakdetect import peakdetect\n",
        "\n",
        "systolic=[]\n",
        "diastolic=[]\n",
        "c=0\n",
        "\n",
        "for n in range(50):\n",
        "    seq = []\n",
        "    bp = []\n",
        "    bp = train_data[n][1]\n",
        "    peaks = find_peaks(bp, scale=100)\n",
        "\n",
        "    for i in range(np.size(peaks)//10):\n",
        "        mean=0\n",
        "        for j in range(10):\n",
        "            mean += (train_data[n][1])[peaks[i*10+j]]\n",
        "        systolic.append(mean/10)\n",
        "        seq = bp[peaks[i*10]:peaks[(i+1)*10-1]]\n",
        "        peaks_ = peakdetect(seq, lookahead=40)\n",
        "        low_peaks = peaks_[1]\n",
        "        avr=0\n",
        "\n",
        "        for k in range(np.shape(low_peaks)[0]):\n",
        "            avr += low_peaks[k][1]\n",
        "        diastolic.append(avr/np.shape(low_peaks)[0])\n",
        "        c+=1"
      ],
      "metadata": {
        "id": "OUy5xwWbYPkZ"
      },
      "execution_count": 99,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Base_line\n",
        "### Calculate Systolic & Diastolic Average(base line)"
      ],
      "metadata": {
        "id": "ymCwor3QZOto"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "sys_mean = 0\n",
        "dia_mean = 0\n",
        "\n",
        "for i in range(np.size(systolic)):\n",
        "    sys_mean += systolic[i]\n",
        "    dia_mean += diastolic[i]\n",
        "\n",
        "sys_mean /= np.size(systolic)\n",
        "dia_mean /= np.size(diastolic)\n",
        "print('systolic mean',sys_mean)\n",
        "print('diastolic mean',dia_mean)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Q6hTHTPPZXMw",
        "outputId": "0858004f-159d-44e6-9eb7-b52e4ec13ad5"
      },
      "execution_count": 100,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "systolic mean 130.86744630750317\n",
            "diastolic mean 65.33401277257616\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Calculate Base Line RMSE"
      ],
      "metadata": {
        "id": "Q5_K4WvqZuyv"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "sys_rmse = 0\n",
        "dia_rmse = 0\n",
        "\n",
        "for i in range(np.size(systolic)):\n",
        "    sys_rmse += (systolic[i]-sys_mean)**2\n",
        "    dia_rmse += (diastolic[i]-dia_mean)**2\n",
        "\n",
        "#calculate base line RMSE\n",
        "sys_rmse_base_line = np.sqrt(sys_rmse/np.size(systolic))\n",
        "dia_rmse_base_line = np.sqrt(dia_rmse/np.size(systolic))\n",
        "print('systolic RMSE error(base_line)=',sys_rmse_base_line)\n",
        "print('diastolic RMSE error(base_line)=',dia_rmse_base_line)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "GMo9cuYvZoqo",
        "outputId": "bb505e15-43d2-426c-95cd-4042d2f955e7"
      },
      "execution_count": 101,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "systolic RMSE error(base_line)= 22.23712522051115\n",
            "diastolic RMSE error(base_line)= 7.271618681512604\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Upsampling - set signals' length to 1200 ms"
      ],
      "metadata": {
        "id": "qjSdlfG-den3"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def upsample_signal(signal, target_length):\n",
        "    # Calculate the factor by which to upsample the signal\n",
        "    upsample_factor = target_length / len(signal)\n",
        "\n",
        "    # Create an array with the target length\n",
        "    upsampled_signal = np.zeros(target_length)\n",
        "\n",
        "    # Linearly interpolate the values\n",
        "    for i in range(target_length):\n",
        "        index = i / upsample_factor\n",
        "        lower_index = int(index)\n",
        "        upper_index = min(lower_index + 1, len(signal) - 1)\n",
        "        fractional_part = index - lower_index\n",
        "\n",
        "        if lower_index == upper_index:\n",
        "            upsampled_signal[i] = signal[lower_index]\n",
        "        else:\n",
        "            upsampled_signal[i] = (1 - fractional_part) * signal[lower_index] + fractional_part * signal[upper_index]\n",
        "\n",
        "    return upsampled_signal"
      ],
      "metadata": {
        "id": "0xlMg2HDgZGs"
      },
      "execution_count": 102,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Upsampling the training set"
      ],
      "metadata": {
        "id": "LXDmcjVgy_0M"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "target_length = 1200\n",
        "\n",
        "for i in range(np.size(data_ampd)):\n",
        "  if len(data_ampd[i]) !=0:\n",
        "    data_ampd[i] = upsample_signal(data_ampd[i], target_length)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "cYDuycQZgeGj",
        "outputId": "de8c4017-a542-471b-ed35-e83b7027d469"
      },
      "execution_count": 103,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3202: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
            "  return asarray(a).size\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Upsampling the test set"
      ],
      "metadata": {
        "id": "QxiO4ZovzGKU"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "target_length = 1200\n",
        "\n",
        "for i in range(np.size(test_ampd)):\n",
        "  if len(test_ampd[i]) !=0:\n",
        "    test_ampd[i] = upsample_signal(test_ampd[i], target_length)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fh2tFK3qxM9P",
        "outputId": "ed25ce6d-a053-48a5-d1c1-f974820366e5"
      },
      "execution_count": 117,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3202: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
            "  return asarray(a).size\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Deleting the empty arrays of the training dataset"
      ],
      "metadata": {
        "id": "SwUnTHFUzVuV"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "zeros_idx = []\n",
        "for i in range(np.size(data_ampd)):\n",
        "\n",
        "  if (np.size(data_ampd[i]) != 1200):\n",
        "\n",
        "    zeros_idx.append(i)\n",
        "\n",
        "\n",
        "data_ampd = np.delete(data_ampd, zeros_idx)\n",
        "data_ampd = np.delete(data_ampd, -1)\n",
        "systolic = np.delete(systolic, zeros_idx)\n",
        "diastolic = np.delete(diastolic, zeros_idx)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1s9vQAt5fxzc",
        "outputId": "7700ec2d-0e9c-4cff-e206-30823a05c4db"
      },
      "execution_count": 108,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/numpy/lib/function_base.py:5071: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
            "  arr = asarray(arr)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Deleting the empty arrays of the test dataset"
      ],
      "metadata": {
        "id": "NLneTDOsz7KD"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "test_zeros_idx = []\n",
        "for i in range(np.size(test_ampd)):\n",
        "\n",
        "  if (np.size(test_ampd[i]) != 1200):\n",
        "\n",
        "    test_zeros_idx.append(i)\n",
        "\n",
        "test_ampd = np.delete(test_ampd, test_zeros_idx)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2If8bJP0yGuE",
        "outputId": "affa2e6e-77bd-4e2c-a438-160bb1836b7e"
      },
      "execution_count": 119,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3202: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
            "  return asarray(a).size\n",
            "/usr/local/lib/python3.10/dist-packages/numpy/lib/function_base.py:5071: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n",
            "  arr = asarray(arr)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Linear Regression"
      ],
      "metadata": {
        "id": "mWBbGFQQ0EfD"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "#y_train = np.ones((np.shape(data_ampd)[0]))\n",
        "X_test = np.ones((np.size(test_ampd),1200))\n",
        "\n",
        "for i in range(np.shape(train_data)[0]):\n",
        "   #y_train[i] = train_data[i][1]\n",
        "   X_test[i] = test_ampd[i]"
      ],
      "metadata": {
        "id": "98mj6Xi3ye-v"
      },
      "execution_count": 120,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "#y_train = np.ones((np.shape(data_ampd)[0]))\n",
        "X_train = np.ones((np.size(data_ampd),1200))\n",
        "\n",
        "for i in range(np.shape(train_data)[0]):\n",
        "   #y_train[i] = train_data[i][1]\n",
        "   X_train[i] = data_ampd[i]"
      ],
      "metadata": {
        "id": "ur8OkgKRqCRi"
      },
      "execution_count": 111,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.metrics import mean_squared_error\n",
        "import math\n",
        "\n",
        "\n",
        "# Initialize the linear regression model\n",
        "systolic_model = LinearRegression()\n",
        "diastolic_model = LinearRegression()\n",
        "\n",
        "# Train the model on the training data\n",
        "systolic_model.fit(X_train, systolic)\n",
        "diastolic_model.fit(X_train, diastolic)\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_train_pred = systolic_model.predict(X_train)\n",
        "diastolic_y_train_pred = diastolic_model.predict(X_train)\n",
        "\n",
        "# Calculate Mean Squared Error (MSE)\n",
        "systolic_mse = mean_squared_error(systolic, systolic_y_train_pred)\n",
        "diastolic_mse = mean_squared_error(diastolic, diastolic_y_train_pred)\n",
        "\n",
        "# Calculate Root Mean Square Error (RMSE)\n",
        "systolic_rmse = np.sqrt(systolic_mse)\n",
        "diastolic_rmse = np.sqrt(diastolic_mse)\n",
        "\n",
        "print(\"SYSTOLIC_MSE:\", systolic_mse)\n",
        "print(\"SYSTOLIC_RMSE:\", systolic_rmse)\n",
        "\n",
        "print(\"DIASTOLIC_MSE:\", diastolic_mse)\n",
        "print(\"DIASTOLIC_RMSE:\", diastolic_rmse)\n",
        "\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_pred = systolic_model.predict(X_test)\n",
        "diastolic_y_pred = diastolic_model.predict(X_test)\n",
        "\n",
        "file_name = \"linear_regression_systolic_prediction.txt\"\n",
        "\n",
        "# Save the array to a text file\n",
        "np.savetxt(file_name, systolic_y_pred, fmt='%d', delimiter='\\t')\n",
        "\n",
        "print(f\"Array saved to {file_name}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0ACapXgSnk3a",
        "outputId": "3e48fef0-529a-42fb-84a6-0674de65ad5c"
      },
      "execution_count": 121,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "SYSTOLIC_MSE: 493.8063554843085\n",
            "SYSTOLIC_RMSE: 22.221754104577535\n",
            "DIASTOLIC_MSE: 52.087745267714865\n",
            "DIASTOLIC_RMSE: 7.217184026177722\n",
            "Array saved to systolic_prediction.txt\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Ridge Regression"
      ],
      "metadata": {
        "id": "teVOemsH0LJ7"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import cross_val_score\n",
        "from sklearn.model_selection import RepeatedKFold\n",
        "from sklearn.linear_model import Ridge\n",
        "from numpy import arange\n",
        "from sklearn.model_selection import GridSearchCV\n",
        "\n",
        "# define models\n",
        "systolic_model = Ridge(alpha=1.0)\n",
        "diastolic_model = Ridge(alpha=1.0)\n",
        "# define model evaluation method\n",
        "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n",
        "grid = dict()\n",
        "grid['alpha'] = arange(0, 1, 0.01)\n",
        "# define search\n",
        "systolic_model = GridSearchCV(systolic_model, grid, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)\n",
        "diastolic_model = GridSearchCV(diastolic_model, grid, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1)\n",
        "\n",
        "# Train the model on the training data\n",
        "systolic_model.fit(X_train, systolic)\n",
        "diastolic_model.fit(X_train, diastolic)\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_train_pred = systolic_model.predict(X_train)\n",
        "diastolic_y_train_pred = diastolic_model.predict(X_train)\n",
        "\n",
        "# Calculate Mean Squared Error (MSE)\n",
        "systolic_mse = mean_squared_error(systolic, systolic_y_train_pred)\n",
        "diastolic_mse = mean_squared_error(diastolic, diastolic_y_train_pred)\n",
        "\n",
        "# Calculate Root Mean Square Error (RMSE)\n",
        "systolic_rmse = np.sqrt(systolic_mse)\n",
        "diastolic_rmse = np.sqrt(diastolic_mse)\n",
        "\n",
        "print(\"SYSTOLIC_MSE:\", systolic_mse)\n",
        "print(\"SYSTOLIC_RMSE:\", systolic_rmse)\n",
        "\n",
        "print(\"DIASTOLIC_MSE:\", diastolic_mse)\n",
        "print(\"DIASTOLIC_RMSE:\", diastolic_rmse)\n",
        "\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_pred = systolic_model.predict(X_test)\n",
        "diastolic_y_pred = diastolic_model.predict(X_test)\n",
        "\n",
        "file_name = \"ridge_regression_systolic_prediction.txt\"\n",
        "\n",
        "# Save the array to a text file\n",
        "np.savetxt(file_name, systolic_y_pred, fmt='%d', delimiter='\\t')\n",
        "\n",
        "print(f\"Array saved to {file_name}\")"
      ],
      "metadata": {
        "id": "dOMqxj4K0Lmi"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Lasso"
      ],
      "metadata": {
        "id": "f-2Mvw1K09oy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import KFold, GridSearchCV\n",
        "from sklearn.linear_model import Lasso\n",
        "\n",
        "# Define the Lasso regression model\n",
        "systolic_lasso_model = Lasso()\n",
        "diastolic_lasso_model = Lasso()\n",
        "\n",
        "# Define the parameter grid for grid search\n",
        "param_grid = {\n",
        "    'alpha': [0.01, 0.1, 1.0, 10.0]\n",
        "}\n",
        "\n",
        "# Create a k-fold cross-validation strategy\n",
        "kf = KFold(n_splits=5, shuffle=True, random_state=42)\n",
        "\n",
        "# Create a GridSearchCV object\n",
        "systolic_model = GridSearchCV(estimator=systolic_lasso_model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=kf)\n",
        "diastolic_model = GridSearchCV(estimator=diastolic_lasso_model, param_grid=param_grid, scoring='neg_mean_squared_error', cv=kf)\n",
        "\n",
        "# Train the model on the training data\n",
        "systolic_model.fit(X_train, systolic)\n",
        "diastolic_model.fit(X_train, diastolic)\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_train_pred = systolic_model.predict(X_train)\n",
        "diastolic_y_train_pred = diastolic_model.predict(X_train)\n",
        "\n",
        "# Calculate Mean Squared Error (MSE)\n",
        "systolic_mse = mean_squared_error(systolic, systolic_y_train_pred)\n",
        "diastolic_mse = mean_squared_error(diastolic, diastolic_y_train_pred)\n",
        "\n",
        "# Calculate Root Mean Square Error (RMSE)\n",
        "systolic_rmse = np.sqrt(systolic_mse)\n",
        "diastolic_rmse = np.sqrt(diastolic_mse)\n",
        "\n",
        "print(\"SYSTOLIC_MSE:\", systolic_mse)\n",
        "print(\"SYSTOLIC_RMSE:\", systolic_rmse)\n",
        "\n",
        "print(\"DIASTOLIC_MSE:\", diastolic_mse)\n",
        "print(\"DIASTOLIC_RMSE:\", diastolic_rmse)\n",
        "\n",
        "\n",
        "#Make predictions on the test data\n",
        "systolic_y_pred = systolic_model.predict(X_test)\n",
        "diastolic_y_pred = diastolic_model.predict(X_test)\n",
        "\n",
        "file_name = \"lasso_systolic_prediction.txt\"\n",
        "\n",
        "# Save the array to a text file\n",
        "np.savetxt(file_name, systolic_y_pred, fmt='%d', delimiter='\\t')\n",
        "\n",
        "print(f\"Array saved to {file_name}\")"
      ],
      "metadata": {
        "id": "fLAx1noy0_eK"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}